/**
 * Web Worker 有以下几个使用注意点。
 * （1）同源限制
 * 分配给 Worker 线程运行的脚本文件，必须与主线程的脚本文件同源。
 * （2）DOM 限制
 * Worker 线程所在的全局对象，与主线程不一样，无法读取主线程所在网页的 DOM 对象，也无法使用document、window、parent这些对象。但是，Worker 线程可以navigator对象和location对象。
 * （3）通信联系
 * Worker 线程和主线程不在同一个上下文环境，它们不能直接通信，必须通过消息完成。
 * （4）脚本限制
 * Worker 线程不能执行alert()方法和confirm()方法，但可以使用 XMLHttpRequest 对象发出 AJAX 请求。
 * （5）文件限制
 * Worker 线程无法读取本地文件，即不能打开本机的文件系统（file://），它所加载的脚本，必须来自网络。
 */

// 引入文件使用
importScripts('../lib/spark.js')
importScripts('../utils/base.js')


self.addEventListener('message', function(e) {
  const { data: { file, result, type } } = e
  switch (type) {
    case 'hash':
      md5Hash(result)
      break
    case 'multiple':
      multipleHash(file)
      break
    default:
      break
  }
})

function md5Hash(result) {
  const md5 = SparkMD5.ArrayBuffer.hash(result)
  log('md5完成,md5值为：',md5 )
  self.postMessage(md5)
}

function multipleHash(file) {
  const { size: fileSize } = file
  const mbUnit = 1024 * 1024
  // 每个分片大小
  const chunkSize = 100 * mbUnit
  // 获取的几个下标
  let chunkPoint = 0 // 当前是第几片
  let startIdx = 0// 截取的字节开始下标
  let endIdx = 0 // 截取的字节结束下标
  // 注册 md5 的队列
  const md5Queue = new Md5Queue(function(md5) {
    self.postMessage(md5)
  })

  // 循环切片
  while (endIdx < fileSize) {
    startIdx = chunkPoint * chunkSize
    endIdx = Math.min((chunkPoint + 1) * chunkSize, fileSize)
    md5Queue.push(file.slice(startIdx, endIdx))
    chunkPoint++
  }
  // 开始计算md5
  md5Queue.calcMd5()
}


